/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.socialfun.controladores;

import com.ec.socialfun.entidades.Operadora;
import com.ec.socialfun.entidades.Pais;
import com.ec.socialfun.enumeradores.DiaSemanaEnum;
import com.ec.socialfun.enumeradores.EstadoEnum;
import com.ec.socialfun.enumeradores.SexoEnum;
import com.ec.socialfun.servicios.CiudadFacade;
import com.ec.socialfun.servicios.OperadoraFacade;
import com.ec.socialfun.servicios.PaisFacade;
import com.ec.socialfun.servicios.ZonaFacade;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;
import org.jboss.logging.Logger;

/**
 *
 * @author hp
 */
public abstract class PadreControlador implements Serializable {

    private static final Logger LOG = Logger.getLogger(PadreControlador.class.getName());
    @EJB
    private OperadoraFacade operadoraFacade;
    @EJB
    protected PaisFacade paisFacade;
    @EJB
    protected CiudadFacade ciudadFacade;
    @EJB
    protected ZonaFacade zonaFacade;
    private List<String> listaManagerReservados;

    {
        listaManagerReservados = new ArrayList<String>();
        listaManagerReservados.add("comunDataManager");
    }

    /**
     * Creates a new instance of PadreControlador
     */
    public PadreControlador() {
    }

    public abstract void iniciarDatos();

    public List<SelectItem> getSelectItemOperadora() {
        List<SelectItem> lista = new ArrayList<SelectItem>();
        lista.add(new SelectItem(null, "Seleccione..."));
        List<Operadora> listaOperadora = operadoraFacade.findAll();
        for (Operadora operadora : listaOperadora) {
            lista.add(new SelectItem(operadora, operadora.getOpNombre()));
        }

        return lista;
    }

    public List<SelectItem> getSelectItemPorDefecto() {
        List<SelectItem> lista = new ArrayList<SelectItem>();
        lista.add(new SelectItem(null, "Seleccione..."));
        return lista;
    }

    public List<SelectItem> getSelectItemPorDefectoConValor(int valor) {
        List<SelectItem> lista = new ArrayList<SelectItem>();
        lista.add(new SelectItem(valor, "Todos..."));
        return lista;
    }

    public List<SelectItem> getSelectItemSexo() {
        List<SelectItem> lista = getSelectItemPorDefecto();
        for (int i = 0; i < SexoEnum.values().length; i++) {
            lista.add(new SelectItem(SexoEnum.values()[i].getCodigo(), SexoEnum.values()[i].getNombre()));
        }
        return lista;
    }

    public List<SelectItem> getSelectItemPais() {
        List<SelectItem> lista = getSelectItemPorDefecto();
        List<Pais> listaPais = paisFacade.findAll();
        for (Pais paisTmp : listaPais) {
            lista.add(new SelectItem(paisTmp, paisTmp.getPaNombre()));
        }
        return lista;
    }

    public List<SelectItem> getSelectItemEstado() {
        List<SelectItem> lista = new ArrayList<SelectItem>();
        for (int i = 0; i < EstadoEnum.values().length; i++) {
            lista.add(new SelectItem(EstadoEnum.values()[i].getCodigo(), EstadoEnum.values()[i].getNombre()));
        }
        return lista;
    }

    /**
     * recupera los selectItem de los estado ACTIVO e INACTIVO
     *
     * @return
     */
    public List<SelectItem> getSelectItemEstados() {

        List<SelectItem> lista = getSelectItemPorDefecto();
        List<String> listaEstados = new ArrayList<String>();
        listaEstados.add(EstadoEnum.ACTIVO.getCodigo());
        listaEstados.add(EstadoEnum.INACTIVO.getCodigo());
        for (String estadoTmp : listaEstados) {
            lista.add(new SelectItem(estadoTmp, estadoTmp));
        }
        return lista;
    }

    /**
     * devuelve lista de dias de la semana LUN - DOM
     * @return
     */
    public List<SelectItem> getSelectItemDiasSemana() {
        List<SelectItem> lista = getSelectItemPorDefecto();
        for (int i = 0; i < DiaSemanaEnum.values().length; i++) {
            DiaSemanaEnum obj = DiaSemanaEnum.values()[i];
            lista.add(new SelectItem(obj.getCodigo(), obj.getNombre()));
        }
        return lista;
    }

    public Date getFechaActual() {
        return new Date();
    }

    public OperadoraFacade getOperadoraFacade() {
        return operadoraFacade;
    }

    public void setOperadoraFacade(OperadoraFacade operadoraFacade) {
        this.operadoraFacade = operadoraFacade;
    }

    public PaisFacade getPaisFacade() {
        return paisFacade;
    }

    public void setPaisFacade(PaisFacade paisFacade) {
        this.paisFacade = paisFacade;
    }

    protected String obtenerUsuarioLogeado() {
        HttpServletRequest hp = obtenerHttpServletRequest();
        return hp.getUserPrincipal().getName();
    }

    private HttpServletRequest obtenerHttpServletRequest() {
        return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    }

    protected void mensajeError(String mensaje) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, mensaje, ""));
    }

    protected void mensajeExitoso(String mensaje) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje, ""));
    }

    protected String obtenerParametro(String id) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        return (String) facesContext.getExternalContext().getRequestParameterMap().get(id);
    }

    /**
     * obtiene parametros de inicio de la aplicacion
     *
     * @param nombreParametro
     * @return
     */
    protected String obtenerParametrosDeInicio(String nombreParametro) {
        return FacesContext.getCurrentInstance().getExternalContext().getInitParameter(nombreParametro);
    }

    /**
     * elimina todos los session bean con exception de los propias de JSF y los
     * que se indiquen en la lista de reservados
     */
    protected void limpiarDataManager() {

        CharSequence cs = ".";
        FacesContext fc = FacesContext.getCurrentInstance();
        Iterator<String> it = fc.getExternalContext().getSessionMap().keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            if (!key.contains(cs) && !listaManagerReservados.contains(key)) {
                LOG.info("Elimina de session: key " + key);
                fc.getExternalContext().getSessionMap().remove(key);
            }
        }
    }
}
